"""
 PCA原理： 二维降一维为例，所有点(2n)投影到一条MSE最小的线上 记录线的二维坐标，其他点记录点
           的一维坐标(n+2)
 SVD原理： A=UEV，参数mxn个减少成m+n+1个
            
"""
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

iris = load_iris()
x = iris.data
y = iris.target

# pca = PCA(2)
# x = pca.fit_transform(x)
#
# plt.figure()
# plt.scatter(x[y == 0, 0], x[y == 0, 1], c="r", label=iris.target_names[0])
# plt.scatter(x[y == 1, 0], x[y == 1, 1], c="b", label=iris.target_names[1])
# plt.scatter(x[y == 2, 0], x[y == 2, 1], c="y", label=iris.target_names[2])
# plt.legend()
# plt.title("PCA of iris dataset")
# plt.show()

# pca = PCA(n_components=0.9, svd_solver='full')  # 按信息保存率选维度
# x = pca.fit_transform(x)
# print(x.shape)

from sklearn.decomposition import TruncatedSVD
# PCA要计算协方差矩阵 因此矩阵过大时 计算资源不够 可以尝试截断SVD
svd = TruncatedSVD(2)
x = svd.fit_transform(x)
print(x.shape)